﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "IDbObject.h"
#include "GcmpModelInterface.h"

namespace gcmp
{
    class ILine3d;
    class Vector3d;
    class IElement;

    /// \brief 线型
    ///
    FINAL_INTERFACE class GCMP_MODEL_INTERFACE_EXPORT ILineTypeData : public IDbObject
    {
    public:
        /// \brief 从线型文件（后缀为lin）创建所有线型并返回
        ///
        /// 线型文件中的线型名称不能重复，否则后面重复的不会加载
        /// \param fileName 文件名称
        /// \return 获得的线型列表
        static std::vector<OwnerPtr<ILineTypeData>> Create(const std::wstring& fileName);

        /// \brief 克隆ILineTypeData
        /// \return 克隆的数据
        virtual OwnerPtr<ILineTypeData> Clone() const = 0;

        /// \brief 根据名称、描述创建线型数据并返回
        ///
        /// 如果名称为空，则创建失败
        /// \param name 线型名称
        /// \param desc 线型描述
        /// \param patternStr 线型定义字符串
        /// \return 获得的线型数据
        static OwnerPtr<ILineTypeData> CreateByName(const std::wstring& name, const std::wstring& desc, const std::wstring& patternStr);

        /// \brief 获取线型名称
        /// \return 获得的线型名称
        virtual std::wstring GetName() const = 0;

        /// \brief 设置线型名称
        ///
        ///  如果新名称为空，则名称设置将失败
        /// \param name 新的线型名称
        /// \return 成功返回true，失败返回false
        virtual bool SetName(const std::wstring& name) = 0;

        /// \brief 获取线型描述
        /// \return 获得的线型描述
        virtual std::wstring GetDescription() const = 0;

        /// \brief 设置线型描述
        /// \param description 新的线型描述字符串
        virtual void SetDescription(const std::wstring& description) = 0;

        /// \brief 线型定义字符串
        /// \return 获得的线型定义字符串
        virtual std::wstring GetPatternString() const = 0;

        /// \brief 设置线型定义字符串
        ///
        /// 线型定义字符串可参见data/acad.lin文件，不符合规范将返回false
        /// \param patternString 新的线型定义字符串
        /// \return 成功返回true，失败返回false, 比如patternStr为空
        virtual bool SetPatternString(const std::wstring& patternString) = 0;

        /// \brief 判断该线型是否是直线
        ///
        /// 直线的线型描述应为：第一个字符是A，后续字符是正数
        /// \return 是直线返回true，否则返回false
        virtual bool IsStraightLine() const = 0;
        
        /// \brief 根据当前的线型格式，离散给定直线，离散结果包含一组线段和一组点。
        /// \param pILine 待离散的直线
        /// \param scale 线型缩放因子。如果缩放因子为负值，系统将会根据当前线型计算出一个建议值。
        /// \param vertices 离散后的线段集，从0开始，每两个点表示一条线段，比如(0,1), (2,3)，(4,5)...
        /// \param points 离散后的点集
        /// \return 成功返回true，失败返回false
        virtual bool Discrete(const ILine3d* pILine, double scale, std::vector<Vector3d>& vertices, std::vector<Vector3d>& points) const = 0;

        /// \brief 根据当前的线型格式，离散给定直线，离散结果包含一组线段和一组点。
        /// \param pILine 待离散的直线
        /// \param scale 线型缩放因子。如果缩放因子为负值，系统将会根据当前线型计算出一个建议值。
        /// \param vertices 离散后的线段集，从0开始，每两个点表示一条线段，比如(0,1), (2,3)，(4,5)...
        /// \param points 离散后的点集
        /// \param textTriangles 文字离散后的三角面片点集,如果是单线体字体文字信息存在vertices中
        /// \param fontName 线型中文字离散的字体，可以为空，为空默认是黑体
        /// \return 成功返回true，失败返回false
        virtual bool Discrete(const ILine3d* pILine, double scale, std::vector<Vector3d>& vertices, std::vector<Vector3d>& points,
            std::vector<Vector3d>& textTriangles, const std::wstring& fontName) const = 0;

        /// \brief 设置该行为所属Element
        /// \param pOwnerElement 所属Element
        /// \return bool
        virtual bool SetOwnerElement(IElement* pOwnerElement) = 0;

        /// \brief 获得该外部对象所属Element
        /// \return const IElement* 所属Element
        virtual const IElement* GetOwnerElement() const = 0;

        /// \brief 获得该外部对象所属Element
        /// \return IElement* 所属Element
        virtual IElement* GetOwnerElement() = 0;
    };
}

